package com.weiawei.ui;

import com.weiawei.Dialog.ExitDialog;
import com.weiawei.Model.Buttons;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

// 菜单通用模型
public class Menu extends JFrame implements ActionListener, MouseListener, MouseMotionListener {

    //   设置关闭按钮和最小化按钮
    private Buttons closeButton;

    private Buttons smallButton;

    //窗口位置
    private Point position;

    //TODO 退出时 ， 弹出对话框确认
    protected ExitDialog exitDialog;

    //关闭类图标 固定的
    private static final String[] CloseIcons = {
            "com/weiawei/images/close_icon.png" , "com/weiawei/images/close_pressed.png"
            , "com/weiawei/images/close_pressed.png"
    };

    private static final String[] smallIcons = {
            "com/weiawei/images/small_icon.png", "com/weiawei/images/small_pressed.png", "com/weiawei/images/small_pressed.png"
    };

    /**
     * Menu类的构造函数
     * 对菜单的窗口样式进行初始化
     * 包括窗口的大小和显示位置，最小化和关闭按钮
     * 生成的Menu实例大小不可更改
     */
    public Menu(){
        this.init();
        //    窗口样式设置
        // 无装饰，取消边框及标题栏
        setUndecorated(true);
        //取消默认布局管理
        setLayout(null);
        //窗口大小不可改变
        setResizable(false);
        //当窗口关闭时，默认为退出程序
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        //设置窗口大小
        setBounds(800, 100, 400, 711);
        setVisible(true);
        paintBackground();
        addMouseListener(this);

    }

    /**
     * 菜单头部的初始化函数
     *
     * 包括菜单栏的 关闭和最小化按钮
     * 其余空白区域用headlabel填补
     */
    private void init(){

        closeButton = new Buttons(CloseIcons,null);

        smallButton = new Buttons(smallIcons ,null);

        // 导航栏
        JLabel headLabel = new JLabel();
        //TODO 退出的弹窗
        exitDialog = new ExitDialog(this,"退出游戏" , true);
        // 设置组件的大小，事件
        closeButton.setBounds(370,0,30,30);
        closeButton.addActionListener(this);
        //锁定按钮边框
        closeButton.setBorderPainted(true);

        smallButton.setBounds(340,0,30,30);
        smallButton.addActionListener(this);
        smallButton.setBorderPainted(true);

        headLabel.setBounds(0,0,340,30);
        headLabel.setBackground(new Color(72,72,72));
        //组件不透明
        headLabel.setOpaque(true);

        //给导航栏注册监听器
        headLabel.addMouseListener(new MouseAdapter() {

            @Override
            public void mousePressed(MouseEvent e) {
                // 根据鼠标的当前位置，获取屏幕的xy轴，将轴值赋出去，定位窗口的位置
                super.mousePressed(e);
                position = new Point(e.getX() , e.getY());
                // 优化：鼠标触碰顶栏时，示意可随意拖动
                setCursor(new Cursor(Cursor.MOVE_CURSOR));
            }

            @Override
            public void mouseReleased(MouseEvent e) {
                {
                    setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
            }}
        });
        headLabel.addMouseMotionListener(this);

        this.add(closeButton);
        this.add(smallButton);
        this.add(headLabel);
        this.repaint();
    }



    // 设置窗口的点击事件 当用户点击最小化按钮时： 最小化窗口
    // 当用户点击关闭按钮时，将窗口关闭
    // e 用户点击的按键
    @Override
    public void actionPerformed(ActionEvent e) {

        if (e.getSource() == closeButton) {
            //点击关闭，弹出确认的对话框
            exitDialog.setVisible(true);
            //确认
            if (exitDialog.getMessage() == exitDialog.exit) {
                JOptionPane.showMessageDialog(this ,"欢迎下次来玩");
                System.exit(0);
            }
        } else if (e.getSource() == smallButton) {
            setExtendedState(ICONIFIED);
        }
    }


    // 绘制背景图，子类继承后再重写
    public void paintBackground() {
    }



    @Override
    public void mouseClicked(MouseEvent e) {

    }

    @Override
    public void mousePressed(MouseEvent e) {

    }

    @Override
    public void mouseReleased(MouseEvent e) {

    }

    @Override
    public void mouseEntered(MouseEvent e) {

    }

    @Override
    public void mouseExited(MouseEvent e) {

    }

    /**
     * 设置窗口拖动事件
     * 当用户点击菜单头部栏时触发事件
     * 窗口跟随用户的鼠标进行移动
     * @param e 鼠标拖动事件
     * 动态当前位置 + 鼠标偏移值 - 初始位置
     */
    @Override
    public void mouseDragged(MouseEvent e) {
        Point newposition = new Point(getLocation().x + e.getX() - position.x,
              getLocation().y + e.getY() - position.y );
        setLocation(newposition.x , newposition.y);
    }

    @Override
    public void mouseMoved(MouseEvent e) {

    }


}
